std:: quailfy the calls for cend/crend/cbegin/cend. Fixes bug 28927. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@278282 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/iterator b/include/iterator index abd142e..0caabbb 100644 --- a/include/iterator +++ b/include/iterator
@@ -1632,16 +1632,16 @@ template <class _Cp> inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 -auto cbegin(const _Cp& __c) -> decltype(begin(__c)) +auto cbegin(const _Cp& __c) -> decltype(_VSTD::begin(__c)) { - return begin(__c); + return _VSTD::begin(__c); } template <class _Cp> inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 -auto cend(const _Cp& __c) -> decltype(end(__c)) +auto cend(const _Cp& __c) -> decltype(_VSTD::end(__c)) { - return end(__c); + return _VSTD::end(__c); } template <class _Cp> @@ -1674,16 +1674,16 @@ template <class _Cp> inline _LIBCPP_INLINE_VISIBILITY -auto crbegin(const _Cp& __c) -> decltype(rbegin(__c)) +auto crbegin(const _Cp& __c) -> decltype(_VSTD::rbegin(__c)) { - return rbegin(__c); + return _VSTD::rbegin(__c); } template <class _Cp> inline _LIBCPP_INLINE_VISIBILITY -auto crend(const _Cp& __c) -> decltype(rend(__c)) +auto crend(const _Cp& __c) -> decltype(_VSTD::rend(__c)) { - return rend(__c); + return _VSTD::rend(__c); } #endif diff --git a/test/std/iterators/iterator.range/begin-end.fail.cpp b/test/std/iterators/iterator.range/begin-end.fail.cpp new file mode 100644 index 0000000..1a14930 --- /dev/null +++ b/test/std/iterators/iterator.range/begin-end.fail.cpp
@@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "test_macros.h" + +#if TEST_STD_VER < 11 +#error +#else + +// <iterator> +// template <class C> auto begin(C& c) -> decltype(c.begin()); +// template <class C> auto begin(const C& c) -> decltype(c.begin()); +// template <class C> auto end(C& c) -> decltype(c.end()); +// template <class C> auto end(const C& c) -> decltype(c.end()); +// template <class E> reverse_iterator<const E*> rbegin(initializer_list<E> il); +// template <class E> reverse_iterator<const E*> rend(initializer_list<E> il); + + +#include <iterator> +#include <cassert> + +namespace Foo { + struct FakeContainer {}; + typedef int FakeIter; + + FakeIter begin(const FakeContainer &) { return 1; } + FakeIter end (const FakeContainer &) { return 2; } + FakeIter rbegin(const FakeContainer &) { return 3; } + FakeIter rend (const FakeContainer &) { return 4; } + + FakeIter cbegin(const FakeContainer &) { return 11; } + FakeIter cend (const FakeContainer &) { return 12; } + FakeIter crbegin(const FakeContainer &) { return 13; } + FakeIter crend (const FakeContainer &) { return 14; } +} + + +int main(){ +// Bug #28927 - shouldn't find these via ADL + (void) std::cbegin (Foo::FakeContainer()); + (void) std::cend (Foo::FakeContainer()); + (void) std::crbegin(Foo::FakeContainer()); + (void) std::crend (Foo::FakeContainer()); +} +#endif